Kubernetes 的 Pod 有生命週期,使用 Replication Controllers 會動態的建立和銷毀 Pod (比如規模擴大或者縮小,或者執行動態更新)。由於這些 Pod 都由自己的ip,這些IP也隨著時間的變化也不能持續依賴。這樣就引發了一個問題:如果一些Pods(讓我們叫它作後台,後端)提供了一些功能供其它的Pod使用(讓我們叫作前台),該如何讓後台能夠存取位於前台 Pod 上的應用,而無需考慮到不同節點的問題呢?
Service 正是 Kubernetes 解決此問題的關鍵,因此接下來文章將會為各位介紹 Kubernetes Service 的概念。
本篇教學會介紹3種不同的 Services連接方式,分別是 ClusterIP, NodePort 以及 LoadBalancer
在開始之前先查看你 local minikube有沒有 run 起來.
$ kubectl get nodes
之後,我們創建一個Deployment物件
$ kubectl run source-ip-app --image=k8s.gcr.io/echoserver:1.4
deployment.apps/source-ip-app created
確認Pod狀態都已經在Running
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
source-ip-app-8687dbf9f-wrqrm 1/1 Running 0 4m
開始建立Service
$ kubectl expose deployment source-ip-app --name=clusterip --port=80 --target-port=8080
service/clusterip exposed
$ kubectl get svc clusterip
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
clusterip ClusterIP 10.0.170.92 <none> 80/TCP 51s
之後在同個Pod 裡透過 busybox 連到該 Pod ,在 wget 後使用上面查詢查到的 CLUSTER-IP
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: sit0@NONE: <NOARP> mtu 1480 qdisc noop qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
40: eth0@if41: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:0e brd ff:ff:ff:ff:ff:ff
inet 172.17.0.14/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
# wget -qO - 10.0.170.92
CLIENT VALUES:
client_address=172.17.0.14
command=GET
...
由上面例子可以得知,該 Service 的存取Ip 跟我們剛建立的 busybox 來源是同一個IP.